package com.atguigu.common.utils;

import com.google.gson.Gson;
import com.qiniu.common.QiniuException;
import com.qiniu.http.Response;
import com.qiniu.storage.BucketManager;
import com.qiniu.storage.Configuration;
import com.qiniu.storage.Region;
import com.qiniu.storage.UploadManager;
import com.qiniu.storage.model.DefaultPutRet;
import com.qiniu.util.Auth;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import java.util.UUID;

public class QiniuOSSUtils {

    private static String accessKey;
    private static String secretKey;
    private static String bucket;

    public final static String BASE_URL;

    static {
        try(InputStream iStream = QiniuOSSUtils.class.getClassLoader().getResourceAsStream("qiniu.properties")) {
            Properties properties = new Properties();
            properties.load(iStream);
            accessKey = properties.getProperty("accessKey");
            secretKey = properties.getProperty("secretKey");
            bucket = properties.getProperty("bucket");
            BASE_URL = properties.getProperty("baseUrl");
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
    public static String uploadFile(InputStream fileByteStream) {
        //构造一个带指定 Region 对象的配置类
        Configuration cfg = new Configuration(Region.huanan());
        cfg.resumableUploadAPIVersion = Configuration.ResumableUploadAPIVersion.V2;// 指定分片上传版本
//...其他参数参考类注释

        UploadManager uploadManager = new UploadManager(cfg);
//...生成上传凭证，然后准备上传

//默认不指定key的情况下，以文件内容的hash值作为文件名
        String fileName = UUID.randomUUID().toString().replaceAll("-", "");
        fileName += System.currentTimeMillis();
        Auth auth = Auth.create(accessKey, secretKey);
        String upToken = auth.uploadToken(bucket);
        try {
            Response response = uploadManager.put(fileByteStream,fileName ,upToken,null, null);
            //解析上传成功的结果

            DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
            return fileName;
        } catch (QiniuException ex) {
            Response r = ex.response;
            System.err.println(r.toString());
            throw new RuntimeException(ex);
        }
    }

    public static void deleteFile(String remoteFileName) {
        Configuration cfg = new Configuration(Region.region0());
        Auth auth = Auth.create(accessKey, secretKey);
        BucketManager bucketManager = new BucketManager(auth, cfg);
        try {
            bucketManager.delete(bucket, remoteFileName);
        } catch (QiniuException ex) {
            //如果遇到异常，说明删除失败
            System.err.println(ex.code());
            System.err.println(ex.response.toString());
            throw new RuntimeException(ex);
        }
    }
}
